home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / dev / lang / f2c3_2src.lha / f2c-for-SASC651 / libI77 / err.c < prev    next >
C/C++ Source or Header  |  1994-06-30  |  7KB  |  292 lines

  1. #ifndef NON_UNIX_STDIO
  2. #include "sys/types.h"
  3. #include "sys/stat.h"
  4. #endif
  5. #include "f2c.h"
  6. #include "fio.h"
  7. #include "fmt.h"    /* for struct syl */
  8. #include "rawio.h"    /* for fcntl.h, fdopen */
  9. #ifdef NON_UNIX_STDIO
  10. #ifdef KR_headers
  11. extern char *malloc();
  12. #else
  13. #undef abs
  14. #undef min
  15. #undef max
  16. #include "stdlib.h"
  17. #endif
  18. #endif
  19.  
  20. /*global definitions*/
  21. unit f__units[MXUNIT];    /*unit table*/
  22. flag f__init;    /*0 on entry, 1 after initializations*/
  23. cilist *f__elist;    /*active external io list*/
  24. flag f__reading;    /*1 if reading, 0 if writing*/
  25. flag f__cplus,f__cblank;
  26. char *f__fmtbuf;
  27. flag f__external;    /*1 if external io, 0 if internal */
  28. #ifdef KR_headers
  29. int (*f__doed)(),(*f__doned)();
  30. int (*f__doend)(),(*f__donewrec)(),(*f__dorevert)();
  31. int (*f__getn)(),(*f__putn)();    /*for formatted io*/
  32. #else
  33. int (*f__getn)(void),(*f__putn)(int);    /*for formatted io*/
  34. int (*f__doed)(struct syl*, char*, ftnlen),(*f__doned)(struct syl*);
  35. int (*f__dorevert)(void),(*f__donewrec)(void),(*f__doend)(void);
  36. #endif
  37. flag f__sequential;    /*1 if sequential io, 0 if direct*/
  38. flag f__formatted;    /*1 if formatted io, 0 if unformatted*/
  39. FILE *f__cf;    /*current file*/
  40. unit *f__curunit;    /*current unit*/
  41. int f__recpos;    /*place in current record*/
  42. int f__cursor,f__scale;
  43.  
  44. /*error messages*/
  45. char *F_err[] =
  46. {
  47.     "error in format",                /* 100 */
  48.     "illegal unit number",                /* 101 */
  49.     "formatted io not allowed",            /* 102 */
  50.     "unformatted io not allowed",            /* 103 */
  51.     "direct io not allowed",            /* 104 */
  52.     "sequential io not allowed",            /* 105 */
  53.     "can't backspace file",                /* 106 */
  54.     "null file name",                /* 107 */
  55.     "can't stat file",                /* 108 */
  56.     "unit not connected",                /* 109 */
  57.     "off end of record",                /* 110 */
  58.     "truncation failed in endfile",            /* 111 */
  59.     "incomprehensible list input",            /* 112 */
  60.     "out of free space",                /* 113 */
  61.     "unit not connected",                /* 114 */
  62.     "read unexpected character",            /* 115 */
  63.     "bad logical input field",            /* 116 */
  64.     "bad variable type",                /* 117 */
  65.     "bad namelist name",                /* 118 */
  66.     "variable not in namelist",            /* 119 */
  67.     "no end record",                /* 120 */
  68.     "variable count incorrect",            /* 121 */
  69.     "subscript for scalar variable",        /* 122 */
  70.     "invalid array section",            /* 123 */
  71.     "substring out of bounds",            /* 124 */
  72.     "subscript out of bounds",            /* 125 */
  73.     "can't read file",                /* 126 */
  74.     "can't write file",                /* 127 */
  75.     "'new' file exists",                /* 128 */
  76.     "can't append to file"                /* 129 */
  77. };
  78. #define MAXERR (sizeof(F_err)/sizeof(char *)+100)
  79.  
  80. #ifdef KR_headers
  81. f__canseek(f) FILE *f; /*SYSDEP*/
  82. #else
  83. f__canseek(FILE *f) /*SYSDEP*/
  84. #endif
  85. {
  86. #ifdef NON_UNIX_STDIO
  87.     return !isatty(fileno(f));
  88. #else
  89.     struct stat x;
  90.  
  91.     if (fstat(fileno(f),&x) < 0)
  92.         return(0);
  93. #ifdef S_IFMT
  94.     switch(x.st_mode & S_IFMT) {
  95.     case S_IFDIR:
  96.     case S_IFREG:
  97.         if(x.st_nlink > 0)    /* !pipe */
  98.             return(1);
  99.         else
  100.             return(0);
  101.     case S_IFCHR:
  102.         if(isatty(fileno(f)))
  103.             return(0);
  104.         return(1);
  105. #ifdef S_IFBLK
  106.     case S_IFBLK:
  107.         return(1);
  108. #endif
  109.     }
  110. #else
  111. #ifdef S_ISDIR
  112.     /* POSIX version */
  113.     if (S_ISREG(x.st_mode) || S_ISDIR(x.st_mode)) {
  114.         if(x.st_nlink > 0)    /* !pipe */
  115.             return(1);
  116.         else
  117.             return(0);
  118.         }
  119.     if (S_ISCHR(x.st_mode)) {
  120.         if(isatty(fileno(f)))
  121.             return(0);
  122.         return(1);
  123.         }
  124.     if (S_ISBLK(x.st_mode))
  125.         return(1);
  126. #else
  127.     Help! How does fstat work on this system?
  128. #endif
  129. #endif
  130.     return(0);    /* who knows what it is? */
  131. #endif
  132. }
  133.  
  134.  void
  135. #ifdef KR_headers
  136. f__fatal(n,s) char *s;
  137. #else
  138. f__fatal(int n, char *s)
  139. #endif
  140. {
  141.     if(n<100 && n>=0) perror(s); /*SYSDEP*/
  142.     else if(n >= (int)MAXERR || n < -1)
  143.     {    fprintf(stderr,"%s: illegal error number %d\n",s,n);
  144.     }
  145.     else if(n == -1) fprintf(stderr,"%s: end of file\n",s);
  146.     else
  147.         fprintf(stderr,"%s: %s\n",s,F_err[n-100]);
  148.     if (f__curunit) {
  149.         fprintf(stderr,"apparent state: unit %d ",f__curunit-f__units);
  150.         fprintf(stderr, f__curunit->ufnm ? "named %s\n" : "(unnamed)\n",
  151.             f__curunit->ufnm);
  152.         }
  153.     else
  154.         fprintf(stderr,"apparent state: internal I/O\n");
  155.     if (f__fmtbuf)
  156.         fprintf(stderr,"last format: %s\n",f__fmtbuf);
  157.     fprintf(stderr,"lately %s %s %s %s",f__reading?"reading":"writing",
  158.         f__sequential?"sequential":"direct",f__formatted?"formatted":"unformatted",
  159.         f__external?"external":"internal");
  160.     sig_die(" IO", 1);
  161. }
  162. /*initialization routine*/
  163.  VOID
  164. f_init(Void)
  165. {    unit *p;
  166.  
  167.     f__init=1;
  168.     p= &f__units[0];
  169.     p->ufd=stderr;
  170.     p->useek=f__canseek(stderr);
  171. #ifdef NON_UNIX_STDIO
  172. #define FMTed 3
  173.     setbuf(stderr, (char *)malloc(BUFSIZ));
  174. #else
  175. #define FMTed 1
  176.     stderr->_flag &= ~_IONBF;
  177. #endif
  178.     p->ufmt=FMTed;
  179.     p->uwrt=1;
  180.     p = &f__units[5];
  181.     p->ufd=stdin;
  182.     p->useek=f__canseek(stdin);
  183.     p->ufmt=FMTed;
  184.     p->uwrt=0;
  185.     p= &f__units[6];
  186.     p->ufd=stdout;
  187.     p->useek=f__canseek(stdout);
  188.     /* IOLBUF and setvbuf only in system 5+ */
  189. #ifdef COMMENTED_OUT
  190.     if(isatty(fileno(stdout))) {
  191.         extern char _sobuf[];
  192.         setbuf(stdout, _sobuf);
  193.         /* setvbuf(stdout, _IOLBF, 0, 0);    /* the buf arg in setvbuf? */
  194.         p->useek = 1;    /* only within a record no bigger than BUFSIZ */
  195.     }
  196. #endif
  197.     p->ufmt=FMTed;
  198.     p->uwrt=1;
  199. }
  200. #ifdef KR_headers
  201. f__nowreading(x) unit *x;
  202. #else
  203. f__nowreading(unit *x)
  204. #endif
  205. {
  206.     long loc;
  207.     int ufmt;
  208.     extern char *f__r_mode[];
  209.  
  210.     if (!x->ufnm)
  211.         goto cantread;
  212.     ufmt = x->ufmt;
  213. #ifdef NON_UNIX_STDIO
  214.     /* =TP=: was ufmt <<= 1; but that's bogus (?) */
  215.         if (ufmt > 1) ufmt -= 2;
  216. #endif
  217.     loc=ftell(x->ufd);
  218.     if(freopen(x->ufnm,f__r_mode[ufmt],x->ufd) == NULL) {
  219.  cantread:
  220.         errno = 126;
  221.         return(1);
  222.         }
  223.     x->uwrt=0;
  224.     (void) fseek(x->ufd,loc,SEEK_SET);
  225.     return(0);
  226. }
  227. #ifdef KR_headers
  228. f__nowwriting(x) unit *x;
  229. #else
  230. f__nowwriting(unit *x)
  231. #endif
  232. {
  233.     long loc;
  234.     int ufmt;
  235.     extern char *f__w_mode[];
  236. #ifndef NON_UNIX_STDIO
  237.     int k;
  238. #endif
  239.  
  240.     if (!x->ufnm)
  241.         goto cantwrite;
  242.     ufmt = x->ufmt;
  243. #ifdef NON_UNIX_STDIO
  244.     /* =TP=: was ufmt <<= 1; but that's bogus (?) */
  245.         if (ufmt > 1) ufmt -= 2;
  246. #endif
  247.     if (x->uwrt == 3) { /* just did write, rewind */
  248. #ifdef NON_UNIX_STDIO
  249.         if (!(f__cf = x->ufd =
  250.                 freopen(x->ufnm,f__w_mode[ufmt],x->ufd)))
  251. #else
  252.         if (close(creat(x->ufnm,0666)))
  253. #endif
  254.             goto cantwrite;
  255.         }
  256.     else {
  257.         loc=ftell(x->ufd);
  258. #ifdef NON_UNIX_STDIO
  259.         if (!(f__cf = x->ufd =
  260.             freopen(x->ufnm, f__w_mode[ufmt+2], x->ufd)))
  261. #else
  262.         if (fclose(x->ufd) < 0
  263.         || (k = x->uwrt == 2 ? creat(x->ufnm,0666)
  264.                      : open(x->ufnm,O_WRONLY)) < 0
  265.         || (f__cf = x->ufd = fdopen(k,f__w_mode[ufmt])) == NULL)
  266. #endif
  267.             {
  268.             x->ufd = NULL;
  269.  cantwrite:
  270.             errno = 127;
  271.             return(1);
  272.             }
  273.         (void) fseek(x->ufd,loc,SEEK_SET);
  274.         }
  275.     x->uwrt = 1;
  276.     return(0);
  277. }
  278.  
  279.  int
  280. #ifdef KR_headers
  281. err__fl(f, m, s) int f, m; char *s;
  282. #else
  283. err__fl(int f, int m, char *s)
  284. #endif
  285. {
  286.     if (!f)
  287.         f__fatal(m, s);
  288.     if (f__doend)
  289.         (*f__doend)();
  290.     return errno = m;
  291.     }
  292.